USE business;
GO

-- jeli tabela istnieje ...
IF OBJECT_ID('dbo.Audyt_serwera_DDL') IS NOT NULL
	DROP TABLE dbo.Audyt_serwera_DDL;   -- ... to jest usuwana 
GO

-- tworzona jest nowa tabela logujca operacje wykonywane na poziomie serwera
CREATE TABLE dbo.Audyt_serwera_DDL
(
	Id              INT NOT NULL PRIMARY KEY IDENTITY(1, 1),
	Czas            DATETIME NOT NULl,
	Typ_operacji    SYSNAME NOT NULL,
	Uzytkownik      SYSNAME NOT NULL,
	Nazwa_schematu  SYSNAME NOT NULL,
	Nazwa_obiektu   SYSNAME NOT NULL,
	Obiekt_docelowy SYSNAME,
	Dane_zdarzenia  XML NOT NULL
);
GO

-- tworzony jest wyzwalacz ... 
CREATE TRIGGER trg_Audyt_serwera_DDL
ON ALL SERVER   -- ... na poziomie serwera ...
FOR DDL_LOGIN_EVENTS  -- ... logujcy operacje DDL wykonywane na loginach
AS

DECLARE
	@dane_zdarzenia AS XML;
-- przypisanie informacji o zdarzeniach wykonywanych na serwerze 
-- do zmiennej typu XML
	SET @dane_zdarzenia = eventdata();
	-- wstawienie danych do tabeli  nazwa tabeli musi by w postaci: 
	-- nazwa_bazy.nazwa_schematu.nazwa_obiektu
	INSERT INTO business.dbo.Audyt_serwera_DDL (
		Czas, Typ_operacji, Uzytkownik, Nazwa_schematu, 
		Nazwa_obiektu, Obiekt_docelowy, Dane_zdarzenia
		)
	VALUES (
		CAST(@dane_zdarzenia.query('data(//PostTime)')   AS VARCHAR(23)),
		CAST(@dane_zdarzenia.query('data(//EventType)')  AS SYSNAME),
		CAST(@dane_zdarzenia.query('data(//LoginName)')  AS SYSNAME),
		CAST(@dane_zdarzenia.query('data(//SchemaName)') AS SYSNAME),
		CAST(@dane_zdarzenia.query('data(//ObjectName)') AS SYSNAME),
		CAST(@dane_zdarzenia.query('data(//TargetObjectName)') AS SYSNAME),
		@dane_zdarzenia
	);
GO


-- stworzenie nowego loginu
CREATE LOGIN test WITH PASSWORD = 'qwerty', DEFAULT_DATABASE = business;
-- aktualizacja stworzonego loginu
ALTER LOGIN test WITH PASSWORD = '1234', DEFAULT_DATABASE = master;
-- usunicie loginu
DROP LOGIN test;
